問題解説: 始まりの国 第二のトラブル

こんにちは!始まりの国 第二のトラブルの問題解説をします。

この問題はLinuxの機能であるiproute2を使うことでLinuxでもポリシールーティングのような機能を使うことができ、それが原因でGoogle public DNSに接続できないという問題でした。ウォーミングアップ問題の割に解答率が低くなってしまい、知らなきゃ解きにくい問題だったので少し申し訳ないことになってしまったと反省しています。

問題文

問題文は以下の通りです。

エイトが一行を案内していると、ギルドでの活躍が伝わったのか、エルフのお姉さんが話しかけてきた。

エルフ「サーバに呪文を書き込んだんだけど、DNSの魔法が動いてないっぽいのよ。ドワーフのおっさんから話は聞いたけど、君たちバリバリできるんだって? いい感じにしてくれない?」

エイト「ちょっとあんたたち呼ばれているわよ。……『呪文』が何かわからないって? 呪文は……そうねたしか設定ファイルとかコンフィグって意味だったと思うわ。はやく解決してきなさい」

また、補足事項として以下のような情報を与えました。

Google public DNSの8.8.8.8もしくは8.8.4.4で名前解決をできるようにしてください。

問題の再現

以下の内容を /etc/networking/if-up.d/static-route に記載して再起動を行うことで、 8.8.0.0/16 に接続できなくなります。

ip rule add table 100 prio 200
ip route add 8.8.0.0/16 via 127.0.0.1 table 100

設定された内容は以下のコマンドで確認することができます。実際に試してみるとよいかもしれません。

# ip rule show
# ip route show table 100

何故このようなトラブルが起きるかというと、Linuxのデフォルトのルーティングテーブルは ip rule show では優先度のpriorityが低く設定されています。それよりも高い優先度でヌルルーティングされてしまったため、パケットが送られないように見えているというわけです。また、 ip rule はあまり見るものではないので気づきにくかったかと思います。

採点基準

この問題の採点基準は以下の3点になっています。

  • ルーティングされていないことに気づく
  • 修正しつながることを確認する
  • ip rule が原因であることに気づく

また、どんな形でもGoogle public DNSにつながり名前解決できていることを確認できれば次に進むことができるようになっていました。

解答例

  • pingtraceroute を使い、DNSが引けない原因がL3疎通性にあることを確認する
    • その際、宛先が 8.8.8.8 のパケットに対して一切外のデバイスから返答がないことからヌルルーティングなどをされていると検討を付ける
  • ip route などの現在のルーティング情報や /etc/networking/ 配下などネットワーク系の設定をするファイルを探し原因を特定する
  • /etc/networking/if-up.d/static-routeをバックアップを取ったうえで削除し、 ip rule del table 100 とすることでGoogle public DNSにつながることを確認する

以上の点を作業経過とともに報告書形式で提出してもらえれば満点を与えました。

講評

冒頭でも書きましたが、iproute2を一切触ったことのない人にとっては非常に解きにくい良くない問題だったかなと反省しています。

ただし、原因について言及せずに /etc/networking/if-up.d/static-route を削除して再起動したら治りました、という回答が多く見られました。その際には

ip rule が原因であることに気づく

という採点基準をもとに減点をしています。大抵の場合はトラブルをどんな形でさえ解決すれば次の問題に進むことができます。しかし、次回以降参加する際にはとりあえず治ったからOKではなくトラブルの原因について言及すると満点を得ることができ、上位を狙うことができるかと思いますので参考にしていただきたいと思います。